Route 53 + CloudFront + S3でZoneApexへのHTTP/HTTPSリクエストをリダイレクトする
こんにちは、佐伯です。
静的サイトを既存のApache or NginxからCloudFront + S3に移行を行う場合、既存サイトがZoneApex(例:example.com)へのリクエストをwww.example.comにリダイレクトしており、引継ぎたいケースがあります。
HTTPのみであれば以下エントリのようにS3の静的ウェブサイトホスティングのリダイレクトルールを使用することで、リダイレクトすることができます。
今回はHTTPSもサポートした構成となります。
やってみた
構成図
リダイレクト用のCloudFrontとS3バケットを作成して、静的サイトのFQDNへリダイレクトします。なお、今回の手順ではリダイレクト先は既に存在している前提となっており、リダイレクト先のリソース作成手順などは省いています。
ACM証明書の発行
リダイレクト用のCloudFrontディストリビューションに適用するACM証明書(今回はFQDN:k-saiki.ga)を発行します。なお、ドメインはfreenomで無料のドメインを取得して検証しています。
リダイレクト用S3バケットの作成
リダイレクト用のS3バケットを作成します。リダイレクト用のS3バケットは静的ウェブサイトホスティングを有効にして、リダイレクト先のFQDNを入力します。プロトコルはリダイレクト先のCloudFrontでも設定(Redirect HTTP to HTTPS)はできますが、無駄なリダイレクトが多くなるのでHTTPSを設定しています。なお、リダイレクトのみであればS3オブジェクトにアクセスする必要もないため、パブリック公開設定の必要もありませんでした。
また、ここでS3のエンドポイントURLをコピーしておきます。
リダイレクト用CloudFrontディストリビューションの作成
Origin Domain Nameには先程コピーしたリダイレクト用S3バケットのエンドポイントを入力します。プルダウンから選択できるS3バケット名はREST APIのエンドポイント(example-bucket.s3.amazonaws.com)となり、静的ウェブサイトエンドポイント(example-bucket.s3-website-.amazonaws.com)の入力は手動で行う必要があります。Viewer Protocol PolicyはHTTP/HTTPSどちらでもリダイレクトさせたいのでHTTP and HTTPSを指定します。
Alternate Domain Names (CNAMEs)にはk-saiki.ga、証明書は先程発行したACM証明書を指定します。
Route 53のレコード設定
Route 53にk-saiki.gaでリダイレクト用CloudFrontへのエイリアスレコードを作成します。これでhttp(s)://k-saiki.gaでアクセスすると、リダイレクト用CloudFrontへリクエストされることになります。
アクセスしてみる
curlでZoneApexにアクセスして、HTTP/HTTPSどちらもhttps://www.k-saiki.gaにリダイレクトされていることを確認できました。
# HTTP $ curl -I http://k-saiki.ga HTTP/1.1 301 Moved Permanently Content-Length: 0 Connection: keep-alive Date: Sun, 30 Jun 2019 13:26:07 GMT Location: https://www.k-saiki.ga/ Server: AmazonS3 Age: 369 X-Cache: Hit from cloudfront Via: 1.1 de1e0512870ecb921a29c3e0d4ec2bf4.cloudfront.net (CloudFront) X-Amz-Cf-Pop: NRT57-C1 X-Amz-Cf-Id: ycAvMeJ-2iNaNamFVM8EFy5iCCnDWm4en-jDSR-NtgQmX9N8KkPb8Q== # HTTPS $ curl -I https://k-saiki.ga HTTP/2 301 content-length: 0 location: https://www.k-saiki.ga/ date: Sun, 30 Jun 2019 13:26:07 GMT server: AmazonS3 age: 371 x-cache: Hit from cloudfront via: 1.1 0932afdcbb622a4425fd671f0d67863a.cloudfront.net (CloudFront) x-amz-cf-pop: NRT57-C1 x-amz-cf-id: db1l3SCLUoZObuPmZ7nqrz3fpuW2pp0C2jT8yQlLIQhLE4QYY8wQNQ==
まとめ
CloudFrontの主な課金対象はインターネットへのデータ転送量ですが、リダイレクト用のCloudFrontはHTTPレスポンスヘッダを返すだけです。リダイレクト用のS3バケットもオブジェクトを保存する必要はないので低額で利用できると思います。ただし、空のS3バケットは削除される可能性があるので、何かしらのファイルを保存することをおすすめします。